package com.wenli.graduate2022.wenliGreenShop.repository.mapper;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wenli.graduate2022.wenliGreenShop.entity.Product;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.mapping.FetchType;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 产品的数据处理接口
 * @author HuangHai
 * @date 2021/10/6 15:29
 */
@Repository
public interface ProductMapper {

    @Results(id = "product",value={
            @Result(property = "productCategory",column = "product_category_id",//根据数据库中的product_category_id字段作为条件，将查到的数据封装到productCategory属性里
                    one = @One(select = "com.wenli.graduate2022.wenliGreenShop.repository.mapper.CategoryMapper.findById",
                            fetchType = FetchType.LAZY))//懒加载，除非详细查看，如调用get方法，才会进行sql执行（打印对象其实是只要重写toString方法也是调用了get方法）
    })
    @Select("select * from product")
    List<Product> findAll();

    @Select("select * from product")
    @ResultMap("product")
    IPage<Product> findByPage(Page page);  //mybatisPlus的自动分页功能


    @Select("select * from product where product_id = #{id}")
    @ResultMap("product")
    Product findById(Integer id);

    @Select("select * from product where product_category_id = #{id}")
    @ResultMap("product")
    List<Product> findByCategoryId(Integer id);

    @Options(useGeneratedKeys = true, keyProperty = "productId",keyColumn = "product_id")
    @Insert("insert into product(product_name,product_title,product_price,product_sale_price," +
            "product_create_date,product_category_id,product_isEnabled)" +
            " values(#{productName},#{productTitle},#{productPrice},#{productSalePrice},#{productCreatDate}," +
            "#{productCategory.categoryId},#{productIsEnable})")
    @ResultMap("product")
    int insert(Product product);


    @Update("update product set product_name=#{productName},product_title=#{productTitle},product_price=#{productPrice}," +
            "product_sale_price=#{productSalePrice},product_create_date=#{productCreateDate},product_category_id=#{productCategory.categoryId}," +
            "product_isEnabled=#{productIsEnabled} where product_id = #{productId} ")
    @ResultMap("product")
    int update(Product product);

    @Delete("delete from product where product_id = #{id}")
    @ResultMap("product")
    int delete(Integer id);

    /**
     * 模糊查询
     * @param name
     * @return
     */
    @Select("select * from product where product_name like concat('%',#{name},'%')")
    @ResultMap("product")
    IPage<Product> findByName( Page page,String name);


    /**
     * 查询最新插入的主键id，LAST_INSERT_ID 是与table无关的，如果向表a插入数据后，再向表b插入数据，LAST_INSERT_ID会改变。
     * 因为LAST_INSERT_ID是基于Connection的，只要每个线程都使用独立的Connection对象，LAST_INSERT_ID函数将返回该Connection对
     * AUTO_INCREMENT列最新的insert or update*作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响，
     * 保证了你能够找回自己的 ID 而不用担心其它客户端的活动，而且不需要加锁。使用单INSERT语句插入多条记录,LAST_INSERT_ID返回一个列表。
     * @return
     */
    @Select("select LAST_INSERT_ID()")
    @ResultMap("product")
    int selectLastInsertId();
}
